#ifndef __FUNC_H__
#define __FUNC_H__
//接收发送缓冲区大小
#define BUF_SIZE 1024
//命令中最多有几个参数
#define MAX_WORDNUM 5
//命令一个参数的最大长度
#define MAX_WORDLEN 40

//套接字类型
typedef int socket_t;

//传输小货车
typedef struct {
    int tag;//命令类型
    int data_length;//data字段的实际长度，strlen (data)
    char data[BUF_SIZE];//变长数据，用于发送命令后缀，文件信息，文件内容
}train_t,*ptrain_t;

//通讯类型
typedef struct {
    socket_t  _sess_fd ;             //对端套接字
    char _sess_buf[BUF_SIZE] ;  //发送接收缓冲区
}Session_t, *pSession_t;

typedef enum{
    TAGUNKNOWN = 0,
    TAGCD = 1,      // 1
    TAGLS,          // 2
    TAGREMOVE,      // 3
    TAGPWD,         // 4
    TAGMKDIR,       // 5
    TAGGETS,        // 6
    TAGPUTS         // 7
}Tag;

//命令类型
typedef struct cmd_s {
    Tag cmd_tag;
    int argc;       //命令中有几个参数
    char cmd[MAX_WORDNUM][MAX_WORDLEN];
}cmd_t, *pcmd_t;

const char *get_cmd_name(Tag cmd_tag);
Tag command_transfer(const char *cmd_name);
Tag get_cmd_tag(const char *cmd_name);

int set_arg(char *line, char *arg);//获取部分字符串
int conf_get(char *conf, char *ip, int *port);//从配置文件中获取参数
int tcp_connect(char *ip, int port);//连接服务器
int upload(int fd_socket, char *filename);//上传文件
int download(int fd_socket, char *filename);//下载文件

int init_cmd(char *line, pcmd_t pcmd); //将line分割，存入cmd
int print_cmd(pcmd_t pcmd); //打印命令
int cmd_check(pcmd_t pcmd);//检查命令是否合法
#endif
